#include "myhead.h"
#include "modul.h"
#include "cJSON.h"

int g_beep_fd = 0;//蜂鸣器
int g_beepa_onff;

char g_sky_buf[20000] = {0};//天气有关信息
char g_sky_time[120];//时间
char g_sky_area[120];//地区
char g_sky_sky[120];//天气
char g_sky_oc[120];//温度

/*************************************************************
蜂鸣器模块
**************************************************************/
void *beebp_ffb(void *agr)
{
	g_beep_fd = open(FILE_DEV, O_RDWR);
	if(g_beep_fd < 0)
	{
		printf("open failure\n");
	}


	while(1)
	{
		ioctl(g_beep_fd, GEC6818_BEEP_ON);
		sleep(1);
		ioctl(g_beep_fd, GEC6818_BEEP_OFF);
		sleep(1);
		if(g_beepa_onff == 1) 
		{
			sleep(1);
			ioctl(g_beep_fd, GEC6818_BEEP_OFF);
			close(g_beep_fd);
			break;
		}
	}
}

/*************************************************************
天气模块：有日期与时间，城市，今日天气，今日温度
**************************************************************/
int MicroWeather(void)
{
    int tcpsock;
    int ret;
    char ip[20] = {0};
    char rbuf[20000] = {0};
    
    // ... (省略了一些初始化代码，保持其他部分不变)
    //定义ipv4地址结构体变量
	struct sockaddr_in bindaddr;
	bzero(&bindaddr,sizeof(bindaddr));
	bindaddr.sin_family=AF_INET; //地址协议
	bindaddr.sin_addr.s_addr=htonl(INADDR_ANY);
	bindaddr.sin_port=htons(5548);  //客户端端口号
	
	//获取你要访问的http服务器ip地址
	//http没有加密的   https在http的基础上添加了加密层
	//ali-weather.showapi.com:万维易源网址地址
	struct hostent *p=gethostbyname("ali-weather.showapi.com"); //天气预报的网址
	//获取IP地址
	struct in_addr *q=(struct in_addr *)(*(p->h_addr_list));
	strcpy(ip,inet_ntoa(*q));
	
	//定义ipv4地址结构体变量存放服务器的ip和端口号
	struct sockaddr_in serveraddr;
	bzero(&serveraddr,sizeof(serveraddr));
	serveraddr.sin_family=AF_INET;
	serveraddr.sin_addr.s_addr=inet_addr(ip); //http服务器的ip
	serveraddr.sin_port=htons(80);  //http协议,端口默认就是80

    // 创建 TCP 套接字、绑定地址等操作与原代码相同
    tcpsock=socket(AF_INET,SOCK_STREAM,0);
	if(tcpsock==-1)
	{
		perror("创建tcp套接字失败了!\n");
		return -1;
	}
	
	//取消端口绑定限制
	int on=1; //非零
	setsockopt(tcpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
	
	//绑定ip和端口号 --》绑定手机号
	ret=bind(tcpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
	if(ret==-1)
	{
		perror("绑定ip和端口号失败了!\n");
		return -1;
	}
	
	//连接服务器 --》拨号
	ret=connect(tcpsock,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
	if(ret==-1)
	{
		perror("连接服务器失败了!\n");
		return -1;
	}
    // 拼接字符串得到完整的 HTTP 请求
    char *httprequest="GET /hour24?area=%E5%B9%BF%E5%B7%9E&data=20240829 HTTP/1.1\r\n"
					  "Host: ali-weather.showapi.com\r\n"
					  "Authorization: APPCODE 9e9d652a137c46b19e5cbd67b39c60c9\r\n\r\n";

    // 发送请求并接收服务器回复
    send(tcpsock, httprequest, strlen(httprequest), 0);
    recv(tcpsock, rbuf, sizeof(rbuf), 0);

    // JSON 解析和打印信息与原代码相同
    //printf("天气预报网址给我回复: %s\n",rbuf);
	char *json_start = strchr(rbuf, '{');
    if (json_start != NULL) 
	{
        // 计算 '{' 之后剩余的数据长度
        size_t remaining_length = strlen(json_start);

        // 将 '{' 之后的内容移动到数组的开头
        memmove(g_sky_buf, json_start, remaining_length + 1); // +1 为了包括字符串结束符 '\0'
    }

	//printf("天气预报网址给我回复: %s\n",buf);


    close(tcpsock);
    return 0;
}

void hqtime()
{
    cJSON *data = cJSON_Parse(g_sky_buf);
	cJSON *obj1 = cJSON_GetObjectItem(data,"showapi_res_body");
	cJSON *obj2 = cJSON_GetObjectItem(obj1,"hourList");
	cJSON *obj3 = cJSON_GetArrayItem(obj2,23);
	cJSON *obj4 = cJSON_GetObjectItem(obj3,"time");//获取当前日期与时间
    //printf("日期与时间:%s\n",obj4->valuestring);
	strcpy(g_sky_time,obj4->valuestring);
}

void hqarea()
{
    cJSON *data = cJSON_Parse(g_sky_buf);
	cJSON *obj1 = cJSON_GetObjectItem(data,"showapi_res_body");
	cJSON *obj2 = cJSON_GetObjectItem(obj1,"hourList");
	cJSON *obj3 = cJSON_GetArrayItem(obj2,23);
    cJSON *obj5 = cJSON_GetObjectItem(obj3,"area");//获取城市信息
	//printf("城市:%s \n",obj5->valuestring);
	strcpy(g_sky_area,obj5->valuestring);
}

void hqsky()
{
    cJSON *data = cJSON_Parse(g_sky_buf);
	cJSON *obj1 = cJSON_GetObjectItem(data,"showapi_res_body");
	cJSON *obj2 = cJSON_GetObjectItem(obj1,"hourList");
	cJSON *obj3 = cJSON_GetArrayItem(obj2,23);
    cJSON *obj6 = cJSON_GetObjectItem(obj3,"weather");//获取天气
	//printf("今日天气:%s\n",obj6->valuestring);
	strcpy(g_sky_sky,obj6->valuestring);
}

void hqoc()
{
    cJSON *data = cJSON_Parse(g_sky_buf);
	cJSON *obj1 = cJSON_GetObjectItem(data,"showapi_res_body");
	cJSON *obj2 = cJSON_GetObjectItem(obj1,"hourList");
	cJSON *obj3 = cJSON_GetArrayItem(obj2,23);
    cJSON *obj7 = cJSON_GetObjectItem(obj3,"temperature");//获取温度
	//printf("今日温度:%s\n",obj7->valuestring);
	strcpy(g_sky_oc,obj7->valuestring);
}

// int main()
// {
// //不使用获取天气会报错
//     // MicroWeather(); // 获取天气信息
// //     hqshijian(); // 获取当前时间
// //     hqdiqu();   // 获取城市信息
// //     hqtianqi();  // 获取今日天气
// //     hqsuentai();  // 获取今日温度
// //     return 0;
// }